package com.lecture.java8.methodref;

import java.util.Comparator;
import java.util.TreeSet;
import java.util.function.*;

/**
 * @program: spring-lecture
 * @description:
 *
 * 方法引用：若lambda体中的内容有方法实现了，我们可以使用“方法引用”
 *           （可以理解为方法引用是lambda表达式的另一种表现形式）
 *           主要有三种语法格式
 *              对象::实例方法名
 *              类::静态方法名
 *              类::实例方法名
 *
 *            注意：lambda体中调用方法的参数列表与返回值类型，要与函数式接口中抽象方法的函数列表和返回值类型保持一致。
 *                  若lambda参数列表中d第一个参数是实例方法的调用者，而第二个参数是实例方法的参数时，可以使用ClassName :: method
 *
 * 构造器引用：
 *      格式：ClassName :: new
 *      注意：需要调用的构造器的参数列表y要与函数式接口中抽象方法的参数列表保持一致。
 *
 * @author: luyn
 * @create: 2020-03-27 16:55
 **/
public class TestMethodRef {
    public void test1() {
        Consumer<String> consumer = (x) -> System.out.println(x);
        Consumer<String> consumer1 = System.out::println;

        String str = "dju";
        str.toLowerCase();

        Supplier<Double> supplier = () -> Math.random();

        Function<String, String> function = (item) -> item.toLowerCase();

        Function<String, String> function1 = String::toUpperCase;

        Runnable runnable = () -> {
            for (int i = 0; i < 50; i++) {
                System.out.println("执行开始runnable：" + i);
            }
        };
        Runnable runnable1 = () -> {
            for (int i = 0; i < 50; i++) {
                System.out.println("----------开始执行runnable------------" + i);
            }
        };
        Thread thread = new Thread(() -> {
            for (int i = 0; i < 50; i++) {
                System.out.println("----------开始执行runnable------------" + i);
            }
        });

        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 50; i++) {
                System.out.println("执行开始runnable：" + i);
            }
        });
        thread.start();
        thread1.start();

        Comparator<Integer> comparator = Integer::compareTo;
        TreeSet<Integer> treeSet = new TreeSet<>((x, y) -> -Integer.compare(x,y));


    }
    // 类::实例方法名
    public void test2() {
        BiPredicate<String, String> biPredicate = (x, y) -> x.equals(y);

        BiPredicate<String, String> biPredicate1 = String::equals;
    }

    // 构造器引用
    public void test3() {
        Supplier<String> supplier = String::new;
        Function<String, String> function = String::new;
        function.apply("");
    }

    // 数组引用


    public static void main(String[] args) {
        TestMethodRef methodRef = new TestMethodRef();
        methodRef.test1();
    }
}
